namespace Cik.Gapi4Net
{
    using System;
    using Domain.Input;
    using Domain.Output.BlogSearch;
    using Domain.Output.BookSearch;
    using Domain.Output.ImageSearch;
    using Domain.Output.LocalSearch;
    using Domain.Output.NewsSearch;
    using Domain.Output.PatentSearch;
    using Domain.Output.TranslateSearch.DetectLanguage;
    using Domain.Output.TranslateSearch.TranslateLanguage;
    using Domain.Output.VideoSearch;
    using Domain.Output.WebSearch;
    using Service.Contracts;

    public interface IGApi4Net
    {
        /// <summary>
        /// Gets the blog service.
        /// </summary>
        /// <value>The blog service.</value>
        IBlogSearchService BlogService { get; }

        /// <summary>
        /// Gets the book service.
        /// </summary>
        /// <value>The book service.</value>
        IBookSearchService BookService { get; }

        /// <summary>
        /// Gets the image service.
        /// </summary>
        /// <value>The image service.</value>
        IImageSearchService ImageService { get; }

        /// <summary>
        /// Gets the local service.
        /// </summary>
        /// <value>The local service.</value>
        ILocalSearchService LocalService { get; }

        /// <summary>
        /// Gets the news service.
        /// </summary>
        /// <value>The news service.</value>
        INewsSearchService NewsService { get; }

        /// <summary>
        /// Gets the patent service.
        /// </summary>
        /// <value>The patent service.</value>
        IPatentSearchService PatentService { get; }

        /// <summary>
        /// Gets the translate service.
        /// </summary>
        /// <value>The translate service.</value>
        ITranslateService TranslateService { get; }

        /// <summary>
        /// Gets the video service.
        /// </summary>
        /// <value>The video service.</value>
        IVideoSearchService VideoService { get; }

        /// <summary>
        /// Gets the web service.
        /// </summary>
        /// <value>The web service.</value>
        IWebSearchService WebService { get; }

        /// <summary>
        /// Blogs the search.
        /// </summary>
        /// <param name="version">The version.</param>
        /// <param name="query">The query.</param>
        /// <returns></returns>
        BlogSearchResult BlogSearch(string version, string query);

        /// <summary>
        /// Searches the specified func.
        /// </summary>
        /// <param name="func">The func.</param>
        /// <returns></returns>
        BlogSearchResult BlogSearch(Func<Blog> func);

        /// <summary>
        /// Books the search.
        /// </summary>
        /// <param name="version">The version.</param>
        /// <param name="query">The query.</param>
        /// <returns></returns>
        BookSearchResult BookSearch(string version, string query);

        /// <summary>
        /// Books the search.
        /// </summary>
        /// <param name="func">The func.</param>
        /// <returns></returns>
        BookSearchResult BookSearch(Func<Book> func);

        /// <summary>
        /// Images the search.
        /// </summary>
        /// <param name="version">The version.</param>
        /// <param name="query">The query.</param>
        /// <returns></returns>
        ImageSearchResult ImageSearch(string version, string query);

        /// <summary>
        /// Images the search.
        /// </summary>
        /// <param name="func">The func.</param>
        /// <returns></returns>
        ImageSearchResult ImageSearch(Func<Domain.Input.Image> func);

        /// <summary>
        /// Locals the search.
        /// </summary>
        /// <param name="version">The version.</param>
        /// <param name="query">The query.</param>
        /// <returns></returns>
        LocalSearchResult LocalSearch(string version, string query);

        /// <summary>
        /// Locals the search.
        /// </summary>
        /// <param name="func">The func.</param>
        /// <returns></returns>
        LocalSearchResult LocalSearch(Func<Local> func);

        /// <summary>
        /// Newses the search.
        /// </summary>
        /// <param name="version">The version.</param>
        /// <param name="query">The query.</param>
        /// <returns></returns>
        NewsSearchResult NewsSearch(string version, string query);

        /// <summary>
        /// Newses the search.
        /// </summary>
        /// <param name="func">The func.</param>
        /// <returns></returns>
        NewsSearchResult NewsSearch(Func<News> func);

        /// <summary>
        /// Patents the search.
        /// </summary>
        /// <param name="version">The version.</param>
        /// <param name="query">The query.</param>
        /// <returns></returns>
        PatentSearchResult PatentSearch(string version, string query);

        /// <summary>
        /// Patents the search.
        /// </summary>
        /// <param name="func">The func.</param>
        /// <returns></returns>
        PatentSearchResult PatentSearch(Func<Patent> func);

        /// <summary>
        /// Translates the search.
        /// </summary>
        /// <param name="version">The version.</param>
        /// <param name="query">The query.</param>
        /// <param name="languagePair">The language pair.</param>
        /// <returns></returns>
        TranslateResult TranslateSearch(string version, string query, string languagePair);

        /// <summary>
        /// Detects the search.
        /// </summary>
        /// <param name="version">The version.</param>
        /// <param name="query">The query.</param>
        /// <returns></returns>
        DetectResult DetectSearch(string version, string query);

        /// <summary>
        /// Videoes the search.
        /// </summary>
        /// <param name="version">The version.</param>
        /// <param name="query">The query.</param>
        /// <returns></returns>
        VideoSearchResult VideoSearch(string version, string query);

        /// <summary>
        /// Videoes the search.
        /// </summary>
        /// <param name="func">The func.</param>
        /// <returns></returns>
        VideoSearchResult VideoSearch(Func<Video> func);

        /// <summary>
        /// Webs the search.
        /// </summary>
        /// <param name="version">The version.</param>
        /// <param name="query">The query.</param>
        /// <returns></returns>
        WebSearchResult WebSearch(string version, string query);

        /// <summary>
        /// Webs the search.
        /// </summary>
        /// <param name="func">The func.</param>
        /// <returns></returns>
        WebSearchResult WebSearch(Func<Web> func);
    }
}